#include<iostream>
using namespace std;
#include<unistd.h>
#include<pthread.h>
#include<string>
#include<semaphore.h>

class Sem{
public:
    Sem(int num){
        //第二个参数为0表示线程间使用这个信号量
        sem_init(&_sem,0,num);
    }
    ~Sem(){
        sem_destroy(&_sem);
    }

    //申请信号量
    void P(){
        sem_wait(&_sem);
    }

    //发布信号量
    void V(){
        sem_post(&_sem);
    }
private:
    sem_t _sem;

};


//使用二位信号量来保持多线程抢票的数据一致性
Sem sem(1);//把信号量当成一个整体来使用就是相当于只有一把锁
int ticket = 10000;
void* get_ticket(void* args){
    string name = static_cast<const char*>(args);
    while(true){
        sem.P();
        if(ticket > 0){
            usleep(1234);
            cout<<"抢票成功:"<<name<<":"<<ticket<<endl;
            ticket--;
            sem.V();
        }else{
            sem.V();
            break;
        }
    

    }
    return nullptr;
}

int main(){
    pthread_t tids[4];
    pthread_create(&tids[0],nullptr,get_ticket,(void*)"thread 1");
    pthread_create(&tids[1],nullptr,get_ticket,(void*)"thread 2");
    pthread_create(&tids[2],nullptr,get_ticket,(void*)"thread 3");
    pthread_create(&tids[3],nullptr,get_ticket,(void*)"thread 4");


    pthread_join(tids[0],nullptr);
    pthread_join(tids[1],nullptr);
    pthread_join(tids[2],nullptr);
    pthread_join(tids[3],nullptr);




    return 0;
}